package 多线程练习.JUC;

import java.util.Random;
import java.util.concurrent.Semaphore;

//需用方法：acquire()
//尝试获取令牌:tryAcquire(),可能成功，可能失败，在获取令牌前，是一种阻塞状态
//释放一些令牌：release(),同时唤醒其他等待的一些线程
//getQueueLength()可以获取等待队列种的线程数量
//hasQueuedTheads(),判断等待队列种是否还有线程
//semaphore.availablePermits():查看现令牌的剩余量
public class SemaphoreTest {

      private static Semaphore semaphore=new Semaphore(20);

      public static void main(String[] args) {
            //模拟停车场的场景:
            /*
                  当停进来一辆车，剩余车位-1
                  开出去一辆车，剩余车位+1
            */
            //模拟50辆车，
            for(int i=0;i<50;i++){
                  Thread thread=new Thread(new Runnable() {
                        @Override
                        public void run() {
                              System.out.println(Thread.currentThread().getName()
                                      +"来到停车场");
                              //此时他要看看又没剩余可用的位置
                              //如果当时没有车位
                              if(semaphore.availablePermits()==0){
                                    //返回可用的令牌数量
                                    System.out.println("车位不足请等待");
                              }
                              //如果当时有车位
                              try {
                                    semaphore.acquire();
                                    System.out.println(Thread.currentThread().getName()+"进入停车场");
                                    Thread.sleep(new Random().nextInt(8888));
                                    System.out.println(Thread.currentThread().getName()+"开出停车场");
                                    //释放车位
                                    semaphore.release();
                              } catch (InterruptedException e) {
                                    throw new RuntimeException(e);
                              }
                        }
                  });
                  thread.start();
            }
      }
}
